package co.edu.usbcali.lidis.vista;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Image;
import java.awt.Toolkit;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;

import org.apache.mahout.cf.taste.impl.model.jdbc.PostgreSQLJDBCDataModel;
import org.apache.mahout.cf.taste.impl.neighborhood.NearestNUserNeighborhood;
import org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender;
import org.apache.mahout.cf.taste.impl.similarity.PearsonCorrelationSimilarity;
import org.apache.mahout.cf.taste.model.JDBCDataModel;
import org.apache.mahout.cf.taste.neighborhood.UserNeighborhood;
import org.apache.mahout.cf.taste.recommender.RecommendedItem;
import org.apache.mahout.cf.taste.recommender.Recommender;
import org.apache.mahout.cf.taste.similarity.UserSimilarity;
import org.postgresql.ds.PGPoolingDataSource;

import co.edu.usbcali.lidis.dataaccess.daoFactory.FachadaBaseDeDatos;
import co.edu.usbcali.lidis.modelo.Proyecto;
import co.edu.usbcali.lidis.modelo.Usuario;

import javax.swing.GroupLayout.Alignment;
import javax.swing.GroupLayout;

@SuppressWarnings("serial")
public class PantallaProyectos extends javax.swing.JFrame {
	private Proyecto[] proyectosArray = null;
	private int itemSeleccionado = 0;
	private Usuario usuario;

	public PantallaProyectos(int idUsuario, List<Proyecto> listProyectos) {
		setUndecorated(true);
		usuario = new Usuario();
		usuario.setUsuId(idUsuario);
		initComponents(listProyectos);
		String path = System.getProperty("user.dir");
		Panel p = new Panel(path + "/imagenes/fondoProyectos.png");
		getContentPane().add(p, BorderLayout.CENTER);
		this.pack();
		setSize(540, 424);
	}

	@SuppressWarnings({ "unchecked", "rawtypes" })
	private void initComponents(List<Proyecto> proyecto) {

		String[] tituloProyectos = new String[proyecto.size()];
		proyectosArray = proyecto.toArray(new Proyecto[proyecto.size()]);

		for (int i = 0; i < proyectosArray.length; i++) {
			tituloProyectos[i] = proyectosArray[i].getProTitulo();
		}

		btnIngresar = new javax.swing.JButton();
		btnSalir = new javax.swing.JButton();
		jScrollPane1 = new javax.swing.JScrollPane();
		jList1 = new javax.swing.JList(tituloProyectos);
		jLabel1 = new javax.swing.JLabel();

		setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
		setTitle("Proyectos");
		setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
		setForeground(java.awt.Color.white);
		setIconImage(getIconImage());

		btnIngresar.setMnemonic('1');
		btnIngresar.setText("Ver Proyecto");

		btnIngresar.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				btnIngresarActionPerformed(evt);
			}
		});

		btnSalir.setMnemonic('s');
		btnSalir.setText("Salir");
		btnSalir.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				btnSalirActionPerformed(evt);
			}
		});

		jList1.setSize(326, 275);
		jScrollPane1.setSize(326, 275);
		jScrollPane1.setPreferredSize(new Dimension(440, 275));
		jScrollPane1.setViewportView(jList1);

		jLabel1.setFont(new java.awt.Font("Segoe UI", 0, 16)); // NOI18N
		jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
		jLabel1.setText("Proyectos");

		javax.swing.GroupLayout layout = new javax.swing.GroupLayout(
				getContentPane());
		layout.setHorizontalGroup(layout
				.createParallelGroup(Alignment.LEADING)
				.addGroup(
						layout.createSequentialGroup()
								.addGroup(
										layout.createParallelGroup(
												Alignment.LEADING)
												.addGroup(
														layout.createSequentialGroup()
																.addGap(51)
																.addGroup(
																		layout.createParallelGroup(
																				Alignment.LEADING,
																				false)
																				.addComponent(
																						jScrollPane1,
																						GroupLayout.PREFERRED_SIZE,
																						GroupLayout.DEFAULT_SIZE,
																						GroupLayout.PREFERRED_SIZE)
																				.addComponent(
																						jLabel1,
																						GroupLayout.DEFAULT_SIZE,
																						326,
																						Short.MAX_VALUE)))
												.addGroup(
														layout.createSequentialGroup()
																.addGap(149)
																.addComponent(
																		btnIngresar)
																.addGap(72)
																.addComponent(
																		btnSalir)))
								.addContainerGap(53, Short.MAX_VALUE)));
		layout.setVerticalGroup(layout.createParallelGroup(Alignment.LEADING)
				.addGroup(
						layout.createSequentialGroup()
								.addGap(23)
								.addComponent(jLabel1)
								.addGap(31)
								.addComponent(jScrollPane1,
										GroupLayout.DEFAULT_SIZE, 275,
										Short.MAX_VALUE)
								.addGap(18)
								.addGroup(
										layout.createParallelGroup(
												Alignment.BASELINE)
												.addComponent(btnIngresar)
												.addComponent(btnSalir))
								.addGap(32)));
		getContentPane().setLayout(layout);

		setSize(new java.awt.Dimension(446, 463));
		setLocationRelativeTo(null);
	}// </editor-fold>

	private void btnSalirActionPerformed(java.awt.event.ActionEvent evt) {
		PantallaInicio pantallaInicio=new PantallaInicio();
		pantallaInicio.setSize(510, 302);
		pantallaInicio.setVisible(true);
		pantallaInicio.setLocationRelativeTo(null);
		dispose();
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);	
	}

	private void btnIngresarActionPerformed(java.awt.event.ActionEvent evt) {
		int selected[] = jList1.getSelectedIndices();

		Long codProyectoRecom = 0L;
		List<Long> idProyectos = new ArrayList<Long>();
		List<Proyecto> proyectosRecomendados = new ArrayList<Proyecto>();

		for (int i = 0; i < selected.length; i++) {
			itemSeleccionado = selected[i];
			System.out.println(itemSeleccionado);
		}

		System.out.println(proyectosArray[itemSeleccionado].getProId());

		try {
			Proyecto proyecto = FachadaBaseDeDatos.getInstance()
					.consultarProyectoPorId(
							proyectosArray[itemSeleccionado].getProId());

			String palabraClave = proyecto.getProPalclave().toUpperCase();
			FachadaBaseDeDatos.getInstance().ejecutarModelo(palabraClave);

			PGPoolingDataSource dataSource = new PGPoolingDataSource();
			dataSource.setServerName("localhost");
			dataSource.setDatabaseName("tesis");
			dataSource.setUser("postgres");
			dataSource.setPassword("P0stgressql");
			dataSource.setMaxConnections(10);

			JDBCDataModel dataModel = new PostgreSQLJDBCDataModel(dataSource,
					"RECOMENDACION", "USU_ID", "PRO_ID", "PUN_VALOR", null);

			UserSimilarity similarity = new PearsonCorrelationSimilarity(
					dataModel);
			UserNeighborhood neighborhood = new NearestNUserNeighborhood(2,
					similarity, dataModel);

			Recommender recommender = new GenericUserBasedRecommender(
					dataModel, neighborhood, similarity);

			List<RecommendedItem> recommendations = recommender.recommend(
					usuario.getUsuId(), 5);

			for (RecommendedItem recommendation : recommendations) {
				codProyectoRecom = recommendation.getItemID();
				idProyectos.add(codProyectoRecom);
				System.out.println(codProyectoRecom);
			}

			for (int i = 0; i < idProyectos.size(); i++) {
				Proyecto proyectoRecomendado = FachadaBaseDeDatos.getInstance()
						.consultarProyectoPorId(idProyectos.get(i));
				proyectosRecomendados.add(proyectoRecomendado);
			}

			PantallaInfoProyecto pantallaInfoProyecto = new PantallaInfoProyecto(
					usuario.getUsuId(), proyecto, proyectosRecomendados);
			pantallaInfoProyecto.setSize(1000, 660);
			pantallaInfoProyecto.setVisible(true);
			pantallaInfoProyecto.setLocationRelativeTo(null);
			dispose();
			setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@Override
	public Image getIconImage() {
		String path = System.getProperty("user.dir");
		System.out.println(path);
		Toolkit toolkit = Toolkit.getDefaultToolkit();
		Image retValue = toolkit.getImage(path + "/imagenes/icono.png");
		return retValue;
	}

	// Variables declaration - do not modify
	private javax.swing.JButton btnIngresar;
	private javax.swing.JButton btnSalir;
	private javax.swing.JLabel jLabel1;
	@SuppressWarnings("rawtypes")
	private javax.swing.JList jList1;
	private javax.swing.JScrollPane jScrollPane1;
	// End of variables declaration
}
